home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / pyshared / ccm / Utils.py < prev    next >
Encoding:
Python Source  |  2009-03-04  |  12.7 KB  |  425 lines

  1. #!/usr/bin/env python
  2. # -*- coding: UTF-8 -*-
  3.  
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU General Public License
  6. # as published by the Free Software Foundation; either version 2
  7. # of the License, or (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful, 
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17. #
  18. # Authors: Quinn Storm (quinn@beryl-project.org)
  19. #          Patrick Niklaus (marex@opencompositing.org)
  20. #          Guillaume Seguin (guillaume@segu.in)
  21. #          Christopher Williams (christopherw@verizon.net)
  22. # Copyright (C) 2007 Quinn Storm
  23.  
  24. import os
  25.  
  26. import pygtk
  27. import gtk
  28. import gtk.gdk
  29. import gobject
  30. import pango
  31. import weakref
  32.  
  33. from ccm.Constants import *
  34. from cgi import escape as protect_pango_markup
  35. import operator
  36. import itertools
  37.  
  38. import locale
  39. import gettext
  40. locale.setlocale(locale.LC_ALL, "")
  41. gettext.bindtextdomain("ccsm", DataDir + "/locale")
  42. gettext.textdomain("ccsm")
  43. _ = gettext.gettext
  44.  
  45. IconTheme = gtk.icon_theme_get_default()
  46. if not IconDir in IconTheme.get_search_path():
  47.     IconTheme.prepend_search_path(IconDir)
  48.  
  49. def gtk_process_events ():
  50.     while gtk.events_pending ():
  51.         gtk.main_iteration ()
  52.  
  53. def getScreens():
  54.     screens = []
  55.     display = gtk.gdk.display_get_default()
  56.     nScreens = display.get_n_screens()
  57.     for i in range(nScreens):
  58.         screens.append(i)
  59.     return screens
  60.  
  61. def protect_markup_dict (dict_):
  62.     return dict((k, protect_pango_markup (v)) for (k, v) in dict_.iteritems())
  63.  
  64. class Image (gtk.Image):
  65.  
  66.     def __init__ (self, name = None, type = ImageNone, size = 32,
  67.                   useMissingImage = False):
  68.         gtk.Image.__init__ (self)
  69.  
  70.         if not name:
  71.             return
  72.  
  73.         if useMissingImage:
  74.             self.set_from_stock (gtk.STOCK_MISSING_IMAGE,
  75.                                  gtk.ICON_SIZE_LARGE_TOOLBAR)
  76.             return
  77.  
  78.         try:
  79.             if type in  (ImagePlugin, ImageCategory, ImageThemed):
  80.                 pixbuf = None
  81.                 
  82.                 if type == ImagePlugin:
  83.                     name = "plugin-" + name
  84.                     try:
  85.                         pixbuf = IconTheme.load_icon (name, size, 0)
  86.                     except gobject.GError:
  87.                         pixbuf = IconTheme.load_icon ("plugin-unknown", size, 0)
  88.                 
  89.                 elif type == ImageCategory:
  90.                     name = "plugins-" + name
  91.                     try:
  92.                         pixbuf = IconTheme.load_icon (name, size, 0)
  93.                     except gobject.GError:
  94.                         pixbuf = IconTheme.load_icon ("plugins-unknown", size, 0)
  95.                 
  96.                 else:
  97.                     pixbuf = IconTheme.load_icon (name, size, 0)
  98.  
  99.                 self.set_from_pixbuf (pixbuf)
  100.             
  101.             elif type == ImageStock:
  102.                 self.set_from_stock (name, size)
  103.         except gobject.GError, e:
  104.             self.set_from_stock (gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_BUTTON)
  105.  
  106. class ActionImage (gtk.Alignment):
  107.  
  108.     map = {
  109.             "keyboard"  : "input-keyboard",
  110.             "button"    : "input-mouse",
  111.             "edges"     : "video-display",
  112.             "bell"      : "audio-x-generic"
  113.           }
  114.  
  115.     def __init__ (self, action):
  116.         gtk.Alignment.__init__ (self, 0, 0.5)
  117.         self.set_padding (0, 0, 0, 10)
  118.         if action in self.map: action = self.map[action]
  119.         self.add (Image (name = action, type = ImageThemed, size = 22))
  120.  
  121. class SizedButton (gtk.Button):
  122.  
  123.     minWidth = -1
  124.     minHeight = -1
  125.  
  126.     def __init__ (self, minWidth = -1, minHeight = -1):
  127.         super (SizedButton, self).__init__ ()
  128.         self.minWidth = minWidth
  129.         self.minHeight = minHeight
  130.         self.connect ("size-request", self.adjust_size)
  131.  
  132.     def adjust_size (self, widget, requisition):
  133.         width, height = requisition.width, requisition.height
  134.         newWidth = max (width, self.minWidth)
  135.         newHeight = max (height, self.minHeight)
  136.         self.set_size_request (newWidth, newHeight)
  137.  
  138. class PrettyButton (gtk.Button):
  139.  
  140.     __gsignals__ = {
  141.         'expose-event'      : 'override',
  142.     }
  143.  
  144.     _old_toplevel = None
  145.  
  146.     def __init__ (self):
  147.         super (PrettyButton, self).__init__ ()
  148.         self.states = {
  149.                         "focus"   : False,
  150.                         "pointer" : False
  151.                       }
  152.         self.set_size_request (200, -1)
  153.         self.set_relief (gtk.RELIEF_NONE)
  154.         self.connect ("focus-in-event", self.update_state_in, "focus")
  155.         self.connect ("focus-out-event", self.update_state_out, "focus")
  156.         self.connect ("hierarchy-changed", self.hierarchy_changed)
  157.  
  158.     def hierarchy_changed (self, widget, old_toplevel):
  159.         if old_toplevel == self._old_toplevel:
  160.             return
  161.  
  162.         if not old_toplevel and self.state != gtk.STATE_NORMAL:
  163.             self.set_state(gtk.STATE_PRELIGHT)
  164.             self.set_state(gtk.STATE_NORMAL)
  165.  
  166.         self._old_toplevel = old_toplevel
  167.  
  168.  
  169.     def update_state_in (self, *args):
  170.         state = args[-1]
  171.         self.set_state (gtk.STATE_PRELIGHT)
  172.         self.states[state] = True
  173.  
  174.     def update_state_out (self, *args):
  175.         state = args[-1]
  176.         self.states[state] = False
  177.         if True in self.states.values ():
  178.             self.set_state (gtk.STATE_PRELIGHT)
  179.         else:
  180.             self.set_state (gtk.STATE_NORMAL)
  181.  
  182.     def do_expose_event (self, event):
  183.         has_focus = self.flags () & gtk.HAS_FOCUS
  184.         if has_focus:
  185.             self.unset_flags (gtk.HAS_FOCUS)
  186.  
  187.         ret = super (PrettyButton, self).do_expose_event (self, event)
  188.  
  189.         if has_focus:
  190.             self.set_flags (gtk.HAS_FOCUS)
  191.  
  192.         return ret
  193.  
  194. class Label(gtk.Label):
  195.     def __init__(self, value = "", wrap = 160):
  196.         gtk.Label.__init__(self, value)
  197.         self.props.xalign = 0
  198.         self.props.wrap_mode = pango.WRAP_WORD
  199.         self.set_line_wrap(True)
  200.         self.set_size_request(wrap, -1)
  201.  
  202. class NotFoundBox(gtk.Alignment):
  203.     def __init__(self, value=""):
  204.         gtk.Alignment.__init__(self, 0.5, 0.5, 0.0, 0.0)
  205.         
  206.         box = gtk.HBox()
  207.         self.Warning = gtk.Label()
  208.         self.Markup = _("<span size=\"large\"><b>No matches found.</b> </span><span>\n\n Your filter \"<b>%s</b>\" does not match any items.</span>")
  209.         value = protect_pango_markup(value)
  210.         self.Warning.set_markup(self.Markup % value)
  211.         image = Image("face-surprise", ImageThemed, 48)
  212.             
  213.         box.pack_start(image, False, False, 0)
  214.         box.pack_start(self.Warning, True, True, 15)
  215.         self.add(box)
  216.  
  217.     def update(self, value):
  218.         value = protect_pango_markup(value)
  219.         self.Warning.set_markup(self.Markup % value)
  220.  
  221. class IdleSettingsParser:
  222.     def __init__(self, context, main):
  223.         def FilterPlugin (p):
  224.             return not p.Initialized and p.Enabled
  225.  
  226.         self.Context = context
  227.         self.Main = main
  228.         self.PluginList = [p for p in self.Context.Plugins.items() if FilterPlugin(p[1])]
  229.         nCategories = len (main.MainPage.RightWidget._boxes)
  230.         self.CategoryLoadIconsList = range (3, nCategories) # Skip the first 3
  231.         print 'Loading icons...'
  232.  
  233.         gobject.timeout_add (150, self.Wait)
  234.  
  235.     def Wait(self):
  236.         if not self.PluginList:
  237.             return False
  238.         
  239.         if len (self.CategoryLoadIconsList) == 0: # If we're done loading icons
  240.             gobject.idle_add (self.ParseSettings)
  241.         else:
  242.             gobject.idle_add (self.LoadCategoryIcons)
  243.         
  244.         return False
  245.     
  246.     def ParseSettings(self):
  247.         name, plugin = self.PluginList[0]
  248.  
  249.         if not plugin.Initialized:
  250.             plugin.Update ()
  251.             self.Main.RefreshPage(plugin)
  252.  
  253.         self.PluginList.remove (self.PluginList[0])
  254.  
  255.         gobject.timeout_add (200, self.Wait)
  256.  
  257.         return False
  258.  
  259.     def LoadCategoryIcons(self):
  260.         from ccm.Widgets import PluginButton
  261.  
  262.         catIndex = self.CategoryLoadIconsList[0]
  263.         pluginWindow = self.Main.MainPage.RightWidget
  264.         categoryBox = pluginWindow._boxes[catIndex]
  265.         for (pluginIndex, plugin) in \
  266.             enumerate (categoryBox.get_unfiltered_plugins()):
  267.             categoryBox._buttons[pluginIndex] = PluginButton (plugin)
  268.         categoryBox.rebuild_table (categoryBox._current_cols, True)
  269.         pluginWindow.connect_buttons (categoryBox)
  270.  
  271.         self.CategoryLoadIconsList.remove (self.CategoryLoadIconsList[0])
  272.  
  273.         gobject.timeout_add (150, self.Wait)
  274.  
  275.         return False
  276.  
  277. # Updates all registered setting when they where changed through CompizConfig
  278. class Updater:
  279.  
  280.     def __init__ (self):
  281.         self.VisibleSettings = {}
  282.         self.Plugins = []
  283.         self.Block = 0
  284.  
  285.     def SetContext (self, context):
  286.         self.Context = context
  287.  
  288.         gobject.timeout_add (2000, self.Update)
  289.  
  290.     def Append (self, widget):
  291.         reference = weakref.ref(widget)
  292.         setting = widget.Setting
  293.         self.VisibleSettings.setdefault((setting.Plugin.Name, setting.Name), []).append(reference)
  294.  
  295.     def AppendPlugin (self, plugin):
  296.         self.Plugins.append (plugin)
  297.  
  298.     def Remove (self, widget):
  299.         setting = widget.Setting
  300.         l = self.VisibleSettings.get((setting.Plugin.Name, setting.Name))
  301.         if not l:
  302.             return
  303.         for i, ref in enumerate(list(l)):
  304.             if ref() is widget:
  305.                 l.remove(ref)
  306.                 break
  307.  
  308.     def UpdatePlugins(self):
  309.         for plugin in self.Plugins:
  310.             plugin.Read()
  311.  
  312.     def UpdateSetting (self, setting):
  313.         widgets = self.VisibleSettings.get((setting.Plugin.Name, setting.Name))
  314.         if not widgets:
  315.             return
  316.         for reference in widgets:
  317.             widget = reference()
  318.             if widget is not None:
  319.                 widget.Read()
  320.  
  321.     def Update (self):
  322.         if self.Block > 0:
  323.             return True
  324.  
  325.         if self.Context.ProcessEvents():
  326.             changed = self.Context.ChangedSettings
  327.             if [s for s in changed if s.Plugin.Name == "core" and s.Name == "active_plugins"]:
  328.                 self.UpdatePlugins()
  329.  
  330.             for setting in list(changed):
  331.                 widgets = self.VisibleSettings.get((setting.Plugin.Name, setting.Name))
  332.                 if widgets: 
  333.                     for reference in widgets:
  334.                         widget = reference()
  335.                         if widget is not None:
  336.                             widget.Read()
  337.                             if widget.List:
  338.                                 widget.ListWidget.Read()
  339.                 changed.remove(setting)
  340.  
  341.             self.Context.ChangedSettings = changed
  342.  
  343.         return True
  344.  
  345. GlobalUpdater = Updater ()
  346.  
  347. class PluginSetting:
  348.  
  349.     def __init__ (self, plugin, widget, handler):
  350.         self.Widget = widget
  351.         self.Plugin = plugin
  352.         self.Handler = handler
  353.         GlobalUpdater.AppendPlugin (self)
  354.  
  355.     def Read (self):
  356.         widget = self.Widget
  357.         widget.handler_block(self.Handler)
  358.         widget.set_active (self.Plugin.Enabled)
  359.         widget.set_sensitive (self.Plugin.Context.AutoSort)
  360.         widget.handler_unblock(self.Handler)
  361.  
  362. class PureVirtualError(Exception):
  363.     pass
  364.  
  365. def SettingKeyFunc(value):
  366.     return value.Plugin.Ranking[value.Name]
  367.  
  368. def CategoryKeyFunc(category):
  369.     if 'General' == category:
  370.         return ''
  371.     else:
  372.         return category or 'zzzzzzzz'
  373.  
  374. def GroupIndexKeyFunc(item):
  375.     return item[1][0]
  376.  
  377. FirstItemKeyFunc = operator.itemgetter(0)
  378.  
  379. EnumSettingKeyFunc = operator.itemgetter(1)
  380.  
  381. PluginKeyFunc = operator.attrgetter('ShortDesc')
  382.  
  383. def HasOnlyType (settings, stype):
  384.     return settings and not [s for s in settings if s.Type != stype]
  385.  
  386. def GetSettings(group, displayOnly=False, types=None):
  387.  
  388.     def TypeFilter (settings, types):
  389.          for setting in settings:
  390.             if setting.Type in types:
  391.                 yield setting
  392.  
  393.     if types:
  394.         display = TypeFilter(group.Display.itervalues(), types)
  395.     else:
  396.         display = group.Display.itervalues()
  397.  
  398.     if displayOnly:
  399.         return display
  400.  
  401.     if types:
  402.         screen = TypeFilter(group.Screens[CurrentScreenNum].itervalues(), types)
  403.     else:
  404.         screen = group.Screens[CurrentScreenNum].itervalues()
  405.  
  406.     return itertools.chain(screen, display)
  407.  
  408. # Support python 2.4
  409. try:
  410.     any
  411.     all
  412. except NameError:
  413.     def any(iterable):
  414.         for element in iterable:
  415.             if element:
  416.                 return True
  417.         return False
  418.  
  419.     def all(iterable):
  420.         for element in iterable:
  421.             if not element:
  422.                 return False
  423.         return True
  424.  
  425.